/// @tags: EGF
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

namespace BlueQuantum {

typedef long long ll;

int const N = 1 << 18, P = 998244353, g = 3, ig = 332748118;

class Polynomial {
 private:
  int f[N];

 public:
  void NTT(bool const typ, int const n);
  int *operator&() { return f; }
  int &operator[](int index) { return f[index]; };
  int const &operator[](int index) const { return f[index]; };
} F, G;

int n, m, D;
int fac[N], ifac[N], cvt[N];

inline ll qpow(ll base, int exp) {
  ll Res = 1;
  while (exp) {
    if (exp & 1) Res = Res * base % P;
    base = base * base % P;
    exp >>= 1;
  }
  return Res;
}

/// @param typ 正/逆向 @param n 项数 必须是2的整数次幂
inline void Polynomial::NTT(bool const typ, int const n) {
  for (int i = 1; i < n; ++i)
    if (i < cvt[i]) swap(f[i], f[cvt[i]]);
  for (int i = 2; i <= n; i <<= 1) {
    int mid = i >> 1, wn = qpow(typ ? g : ig, (P - 1) / i);
    for (int j = 0; j < n; j += i) {
      ll wk = 1;
      for (int k = 0; k < mid; ++k, (wk *= wn) %= P) {
        ll t = wk * f[j + k + mid] % P;
        if ((f[j + k + mid] = f[j + k] - t) < 0) f[j + k + mid] += P;
        if ((f[j + k] += t) >= P) f[j + k] -= P;
      }
    }
  }
  if (!typ) {
    ll inv = qpow(n, P - 2);
    for (int i = 0; i < n; ++i) f[i] = inv * f[i] % P;
  }
}

inline int main() {
  cin >> D >> n >> m;
  if (m + m <= n - D) return cout << qpow(D, n), 0;
  if (m + m > n) return cout << '0', 0;
  fac[0] = 1;
  for (int i = 1; i <= D; ++i) fac[i] = (ll)fac[i - 1] * i % P;
  ifac[D] = qpow(fac[D], P - 2);
  for (int i = D - 1; i >= 0; --i) ifac[i] = (ll)ifac[i + 1] * (i + 1) % P;
  for (int i = 0; i <= D; ++i) {
    F[i] = (ll)ifac[i] * qpow((D - 2 * i + P) % P, n) % P;
    if (i & 1) F[i] = P - F[i];
  }
  for (int i = 0; i <= D; ++i) G[i] = ifac[i];
  int maxl = 1;
  while (maxl <= D + D) maxl <<= 1;
  for (int i = 1; i < maxl; ++i) cvt[i] = cvt[i >> 1] >> 1 | ((i & 1) ? (maxl >> 1) : 0);
  F.NTT(true, maxl), G.NTT(true, maxl);
  for (int i = 0; i < maxl; ++i) F[i] = (ll)F[i] * G[i] % P;
  F.NTT(false, maxl);
  for (int i = D + 1; i < maxl; ++i) F[i] = 0, G[i] = 0;
  for (int i = 0; i <= D; ++i)
    F[i] = (ll)F[i] * fac[D] % P * ifac[D - i] % P * qpow(qpow(2, P - 2), i) % P *
           fac[i] % P;
  for (int i = 0; i <= D; ++i) G[D - i] = (i & 1) ? P - ifac[i] : ifac[i];
  F.NTT(true, maxl), G.NTT(true, maxl);
  for (int i = 0; i < maxl; ++i) F[i] = (ll)F[i] * G[i] % P;
  F.NTT(false, maxl);
  ll ans = 0;
  for (int i = 0; i <= n - m * 2; ++i)
    if ((ans += (ll)F[D + i] * ifac[i] % P) >= P) ans -= P;
  cout << ans;
  return 0;
}

}  // namespace BlueQuantum

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen("/tmp/CodeTmp/testdata.in", "r", stdin);
  freopen("/tmp/CodeTmp/testdata.out", "w", stdout);
#else
  freopen("P5401 [CTS2019] 珍珠.in", "r", stdin);
  freopen("P5401 [CTS2019] 珍珠.out", "w", stdout);
#endif
#endif

  ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  return BlueQuantum::main();
}
